package org.gtesoreria

import java.text.SimpleDateFormat;

import org.gtesoreria.utils.MenuOption;

import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;


class ConsultaAfiliadosController {

	public static final def MESES = ["ENERO","FEBRERO","MARZO","ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE"]
    def index = { 
		redirect(action: "consultaAfiliados", params: params)
	}
	
	def home = {
		def afiliadosOptions = [new MenuOption(link:"/GTesoreria/consultaAfiliados/home", text:"Consultas")]
		render(view:"consultaAfiliadosHome", model:[breadcrumbOptions:["Afiliados","Consultas"], afiliadosOptions:afiliadosOptions])
	}
	def consultaService
	
	def consultaHijos = {
		params.max = Math.min(params.max ? params.int('max') : 30, 100)
		def anSort = params.sort ? params.sort : "fechaNacimiento"
		def anOrder = params.order ? params.order : "desc"
		if(params.edadTo && params.edadFrom && Integer.parseInt(params.edadFrom) <= Integer.parseInt(params.edadTo)) {
			def query = Familiar.createCriteria()
			def hijosEntreEdades = []
			String titulo
			if(Integer.parseInt(params.edadFrom) < Integer.parseInt(params.edadTo)){
				hijosEntreEdades  = consultaService.consultaHijos(params.edadFrom, params.edadTo, params.lugarTrabajo, params.delegado, params.sexo, anSort, anOrder, params.offset, params.max);
				titulo = "Hijos de Afiliados entre " + params.edadFrom + " y " + params.edadTo + " a&ntilde;os."
			}
			if(params.edadFrom.equals(params.edadTo)){
				hijosEntreEdades  = consultaService.consultaHijos(params.edadFrom, params.edadTo, params.lugarTrabajo, params.delegado, params.sexo, anSort, anOrder, params.offset, params.max);
				titulo = "Hijos de Afiliados de " + params.edadFrom + " a&ntilde;os."
			}
			def afiliadosOptions = [new MenuOption(link:"/GTesoreria/consultaAfiliados/home", text:"Consultas")]
			render(view:"consultaHijos", model:[hijosList: hijosEntreEdades, 
				hijosTotal: hijosEntreEdades ? hijosEntreEdades.totalCount:0, 
				titulo:titulo, 
				edadFrom:params.edadFrom,
				edadTo : params.edadTo,
				sexo:params.sexo,
				delegado:params.delegado,
				lugarTrabajo:params.lugarTrabajo,
				breadcrumbOptions:["Afiliados","Consultas"], 
				afiliadosOptions:afiliadosOptions])
		} else {
			flash.message = "Los parametros de la consulta son incorrectos"
			redirect(action:"home")
		}
		
		
	}
	
	def consultaCumples = {
		def anSort = params.sort ? params.sort : "fechaNacimiento"
		def anOrder = params.order ? params.order : "desc"
		params.max = Math.min(params.max ? params.int('max') : 30, 100)
		if(params.mesCumple) {
			def result = consultaService.consultaCumples(params.delegado, params.lugarTrabajo, params.mesCumple, anSort, anOrder, params.offset, params.max)
			def mes = MESES[new Integer(params.mesCumple) - 1 ]
			def afiliadosOptions = [new MenuOption(link:"/GTesoreria/consultaAfiliados/home", text:"Consultas")]
			
			render(view:"consultaCumples", model:[afiliadosList:result, afiliadosTotal: result ? result.totalCount:0, titulo:"Afiliados que cumplen el mes de " + mes,
				 breadcrumbOptions:["Afiliados","Consultas"], afiliadosOptions:afiliadosOptions,
			 	 tipoConsulta:"consultaCumples",delegado:params.delegado, lugarTrabajo:params.lugarTrabajo, mesCumple:params.mesCumple], offset:params.offset)
		} else {
			flash.message = "Los parametros de la consulta son incorrectos"
			redirect(action:"home")
		}
	}
	
	def consultaDelegado = {
		def anSort = params.sort ? params.sort : "fechaNacimiento"
		def anOrder = params.order ? params.order : "desc"
		params.max = Math.min(params.max ? params.int('max') : 30, 100)
		if(params.delegado) {
			def result = null
			def titulo
			if(params.delegado.equals("null")) {
				titulo = "Afiliados sin delegado"
			} else {
				titulo = "Afiliados cuyo delegado es " + Afiliado.get(params.delegado).apellidoNombre
			}
			result = consultaService.consultaDelegado(params.delegado, params.lugarTrabajo,anSort, anOrder, params.offset, params.max)
			def afiliadosOptions = [new MenuOption(link:"/GTesoreria/consultaAfiliados/home", text:"Consultas")]
			render(view:"consultaCumples", model:[afiliadosList:result, afiliadosTotal: result ? result.totalCount:0, titulo:titulo, 
				breadcrumbOptions:["Afiliados","Consultas"], afiliadosOptions:afiliadosOptions, 
				tipoConsulta:"consultaDelegado",delegado:params.delegado, lugarTrabajo:params.lugarTrabajo, mesCumple:"null"])
		} else {
			flash.message = "Los parametros de la consulta son incorrectos"
			redirect(action:"home")
		}
	}
	
	def consultaLugarTrabajo = {
		def anSort = params.sort ? params.sort : "fechaNacimiento"
		def anOrder = params.order ? params.order : "desc"
		params.max = Math.min(params.max ? params.int('max') : 30, 100)
		if(params.lugarTrabajo) {
			def result = null
			def titulo
			result = consultaService.consultaLugarTrabajo(params.delegado, params.lugarTrabajo,anSort, anOrder, params.offset, params.max)
			titulo = "Afiliados cuyo Centro de Trabajo es " + LugarTrabajo.get(params.lugarTrabajo)
			def afiliadosOptions = [new MenuOption(link:"/GTesoreria/consultaAfiliados/home", text:"Consultas")]
			render(view:"consultaCumples", model:[afiliadosList:result, afiliadosTotal: result ? result.totalCount:0, titulo:titulo, 
				breadcrumbOptions:["Afiliados","Consultas"], afiliadosOptions:afiliadosOptions,
				tipoConsulta:"consultaLugarTrabajo",delegado:params.delegado, lugarTrabajo:params.lugarTrabajo, mesCumple:"null"])
		} else {
			flash.message = "Los parametros de la consulta son incorrectos"
			redirect(action:"home")
		}
	}
	
	def showPadre= {
		redirect(controller:"afiliado", action:"show", params: params)
	}
	
	
	
	def static roundDownYear(Date fecha) {
		def cal = Calendar.instance
		cal.setTime(fecha);
		cal.set(Calendar.DAY_OF_YEAR, 1);
		return cal.getTime();
	}
	
	def static roundUpYear(Date fecha) {
		def cal = Calendar.instance
		cal.setTime(fecha);
		cal.set(Calendar.DAY_OF_YEAR, 365);
		return cal.getTime();
	}
	
	
	def exportarConsultaHijos = {
		def file = createReport(consultaService.consultaHijos(params.edadFrom, 
								params.edadTo, 
								params.lugarTrabajo, 
								params.delegado, 
								params.sexo,"fechaNacimiento", "desc", "0", 2000),["Nro",
								"Legajo",
								"Nombre y Apellido",
								"Fecha de Nacimiento", 
								"Edad", 
								"Lugar de Trabajo",
								"Delegado",
								"Categoria"],
							"Hijos entre " + params.edadFrom + " y " + params.edadTo + " anios.")
		
		response.setHeader('Content-disposition', 'attachment;filename=ConsultaHijos.xls')
		response.setHeader('Content-length', "${file.size()}")
		response.contentType = "application/vnd.ms-excel"
		
		OutputStream out = new BufferedOutputStream(response.outputStream)

		try {
			out.write(file.bytes)

		} finally {
			out.close()
			return false
		}

	}
	def reportService
	def exportarConsultaAfiliados = {
		def result = null
		def fileName, title = ""
		if("consultaCumples".equals(params.tipoConsulta)){
			result = consultaService.consultaCumples(params.delegado,params.lugarTrabajo,params.mesCumple,"fechaNacimiento", "desc", "0", 2000)
			fileName = "ConsultaCumpleanios.xls"
			title = "Afiliados que cumplen en " + params.mesCumple
		}else if("consultaLugarTrabajo".equals(params.tipoConsulta)){
			result = consultaService.consultaLugarTrabajo(params.delegado,params.lugarTrabajo,"fechaNacimiento", "desc", "0", 2000)
			fileName = "ConsultaPorLugarDeTrabajo.xls"
			title = "Afiliados que trabajan en " + params.lugarTrabajo
		} else if("consultaDelegado".equals(params.tipoConsulta)){
			result = consultaService.consultaDelegado(params.delegado,params.lugarTrabajo,"fechaNacimiento", "desc", "0", 2000)
			fileName = "ConsultaPorDelegado.xls"
			title = "Afiliados con " + params.delegado + " como Delegado"
		}
		
		def file = reportService.createReport(result,["Nro",
			"Nombre y Apellido",
			"Fecha de Nacimiento",
			"Edad",
			"Padre/Madre",
			"Lugar de Trabajo",
			"Delegado"],
			title)
		
		response.setHeader('Content-disposition', 'attachment;filename=' + fileName)
		response.setHeader('Content-length', "${file.size()}")
		response.contentType = "application/vnd.ms-excel"
		
		OutputStream out = new BufferedOutputStream(response.outputStream)
		
				try {
					out.write(file.bytes)
		
				} finally {
					out.close()
					return false
				}
	}
	
	
	
	

}
